#ifndef	OBJECT_H
#define	OBJECT_H

#include <stdarg.h>
#include <stddef.h>
#include <stdio.h>

/* ----------------------------------------------------------------------------------------------- *
 *	"красивые" константы-указатели на мета-информацию об OBJECT и CLASS
 */

extern const void * Object;      // использование: new(Object);
extern const void * ObjectClass; // использование: new(ObjectClass, 
                                 //                    "имя", предок, размер, 
                                 //                    селектор_0, метод_0, ... NULL);

/* ----------------------------------------------------------------------------------------------- *
 *	динамическое создание/уничтожение объектов
 */

void * new(const void * _pClass, ...); 
void inplace_new(void * _pSelf, const void * _pClass, ...);
void delete(void * _pSelf);

/* ----------------------------------------------------------------------------------------------- *
 *	функции с динамическим связыванием (dynamic linking)
 *	указатели на эти функции используются также как селекторы при заполнении мета-информации
 *		динамическое связывание 4 методов для типа OBJECT и его наследников
 */

void * ctor  (void * _pSelf, va_list * ppArgs); // вызов конструктора объекта
void * dtor  (void * _pSelf);                   // вызов деструктора объекта


/* ----------------------------------------------------------------------------------------------- *
 *	вспомогательные функции для извлечения мета-информации о типе
 */

const void * classOf(const void * _pSelf);  // получить мета-информацию об объекте
size_t       sizeOf (const void * _pSelf);  // получить размер объекта в байтах
const void * baseOf (const void * _pClass); // получить мета-информацию о базовом типе

#endif
